#include "Lista.h"

Lista::Lista():primerNodo(NULL), ultimoNodo(NULL) {
}

void Lista::enlazar(Nodo *unNodo, Nodo *otroNodo) {
	unNodo->setSiguiente(otroNodo);
	otroNodo->setSiguiente(NULL);
}

void Lista::agregar(char x, char y) {
	Nodo *nodo = new Nodo(NULL, x, y);
	if(!this->primerNodo)
		this->primerNodo = nodo;
	else
		enlazar(this->ultimoNodo, nodo);
	this->ultimoNodo = nodo;
}

Lista::~Lista() {
	Nodo *actual;
	while (this->primerNodo) {
		actual = this->primerNodo;
		this->primerNodo = this->primerNodo->getSiguiente();
		delete actual;
	}
}

/* Dadas dos listas agrega la segunda al final de la primera y
 * devuelve la concatenacion de las mismas.*/

Lista* operator+ (const Lista& unaLista, const Lista& otraLista) {
	Lista *suma = new Lista();
	Nodo *nodoUnaLista = NULL;
	Nodo *nodoOtraLista = NULL;
	nodoUnaLista = unaLista.primerNodo;
	nodoOtraLista = otraLista.primerNodo;
	while (nodoUnaLista->getSiguiente()) {
		suma->agregar(nodoUnaLista->getCoordX(), nodoUnaLista->getCoordY());
		nodoUnaLista = nodoUnaLista->getSiguiente();
	}
	suma->agregar(nodoUnaLista->getCoordX(), nodoUnaLista->getCoordY());
	while (nodoOtraLista->getSiguiente()) {
		suma->agregar(nodoOtraLista->getCoordX(), nodoOtraLista->getCoordY());
		nodoOtraLista = nodoOtraLista->getSiguiente();
	}
	suma->agregar(nodoOtraLista->getCoordX(), nodoOtraLista->getCoordY());
	return suma;
}

std::ostream &operator<< (std::ostream &stream, Lista &lista) {
	Nodo *siguiente = lista.primerNodo;
	while(siguiente && siguiente->getSiguiente()) {
		stream  << siguiente->getCoordX() << siguiente->getCoordY() << " ";
		siguiente = siguiente->getSiguiente();
	}
	stream  << siguiente->getCoordX() << siguiente->getCoordY() << " ";
	stream << std::endl;
	return stream;
}
